package com.mazaiting.emotion.util

import android.annotation.TargetApi
import android.app.Activity
import android.graphics.Rect
import android.os.Build
import android.util.DisplayMetrics
import com.mazaiting.log.L

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-08-08
 * @description 输入法工具类
 */
object InputMethodUtil {

    /**
     * 获取键盘高度
     * @param activity 活动
     */
    fun getSupportSoftInputHeight(activity: Activity): Int {
        // 获取键盘高度
        val rect = Rect()
        // 获取显示大小
        activity.window.decorView.getWindowVisibleDisplayFrame(rect)
        // 获取屏幕的高度
        val screenHeight = activity.window.decorView.rootView.height
        // 计算软件盘的高度
        var softInputHeight = screenHeight - rect.bottom

        /**
         * 某些Android版本下，没有显示软键盘时减出来的高度总是144，而不是零，
         * 这是因为高度是包括了虚拟按键栏的(例如华为系列)，所以在API Level高于20时，
         * 我们需要减去底部虚拟按键栏的高度（如果有的话）
         */
//        if (Build.VERSION.SDK_INT >= 20) {
//            softInputHeight -= getSoftButtonsBarHeight()
//        }
        softInputHeight -= getSoftButtonsBarHeight(activity)

        if (softInputHeight < 0) {
            L.w("SwitchKeyboard--Warning: value of softInputHeight is below zero!")
            softInputHeight = 0
        }
        return softInputHeight
    }

    /**
     * 底部虚拟按键栏的高度
     * 某些Android版本下，没有显示软键盘时减出来的高度总是144，而不是零，
     * 这是因为高度是包括了虚拟按键栏的(例如华为系列)，所以在API Level高于20时，
     * 我们需要减去底部虚拟按键栏的高度（如果有的话）
     * @param activity 活动
     * @return 虚拟键盘高度
     */
    private fun getSoftButtonsBarHeight(activity: Activity): Int {
        val metrics = DisplayMetrics()
        // 这个方法获取可能不是真实屏幕的高度
        activity.windowManager.defaultDisplay.getMetrics(metrics)
        val usableHeight = metrics.heightPixels
        // 获取当前屏幕的真实高度
        activity.windowManager.defaultDisplay.getRealMetrics(metrics)
        val realHeight = metrics.heightPixels
        // 计算高度
        return if (realHeight > usableHeight) {
            realHeight - usableHeight
        } else {
            0
        }
    }
}